package cn.wn.service.impl;

import cn.wn.mapper.PermissionMapper;
import cn.wn.mapper.UserMapper;
import cn.wn.model.ResultInfo;
import cn.wn.pojo.Permission;
import cn.wn.pojo.User;
import cn.wn.service.PermissionService;
import cn.wn.service.UserService;
import com.github.pagehelper.PageInfo;
import jdk.internal.org.objectweb.asm.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PermissionServiceImpl implements PermissionService {
    // 注入mapper
    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public List<Permission> findPermissionByUserId(Integer userId) {
        return permissionMapper.findPermissionByUserId(userId);
    }

    @Override
    public ResultInfo findRolePermission(Integer roleId) {
        // 1. 查询所有权限
        List<Permission> permissions = permissionMapper.findAll();
        // 2. 查询角色的权限
        List<Permission> rolePermissions = permissionMapper.findRolePermission(roleId);
        // 3. 封装返回结果:
        // ztree需要的数据格式= [{ id:2, pId:0, name:"随意勾选 2", checked:true, open:true}]
        List<Map<String,Object>> result = new ArrayList();
        // 3.1 遍历所有的权限
        permissions.forEach(permission->{
            // 创建map，封装json数据
            Map<String,Object> map = new HashMap<>();
            map.put("id",permission.getPid());
            map.put("pId",permission.getParentId());
            map.put("name",permission.getPname());
            map.put("open",true);
            // 遍历角色拥有的权限，作用：是否选中。角色已经拥有改权限，就选中。
            if (!CollectionUtils.isEmpty(rolePermissions)) {
                rolePermissions.forEach(rolePermission->{
                    if (permission.getPid() == rolePermission.getPid()) {
                        // 说明：角色有该权限，就默认选中
                        map.put("checked", true);
                    }
                });
            }
            // 添加到返回结果
            result.add(map);
        });
        return ResultInfo.ok(result);
    }

    /**
     * 实现角色分配权限
     */
    @Override
    public ResultInfo updateRolePermission(Integer roleId, Integer[] permissions) {
        //第一步：权限树，全部取消选择，权限ids为null，根据角色id删除中间表数据
        if(permissions == null || permissions.length == 0) {
            permissionMapper.deleteRolePermissionByRoleId(roleId);
            return ResultInfo.ok();
        }
        //第二步：当用户减少了角色的权限后，数据库要删除角色权限关系。
        //比如：当前角色有权限1234， 用户只在权限树上选择了123，要求要删除4的权限
        //SQL: DELETE FROM wn_role_permission WHERE rid=2 AND pid NOT IN (1,2,3)
        permissionMapper.deleteNotExists(roleId,permissions);
        // 遍历选中的权限
        for (Integer permission : permissions) {
            //第三步：插入角色权限数据之前，先查询，如果不存在则插入
            // SELECT COUNT(*) FROM wn_role_permission WHERE rid=2 AND pid=10
            Long count = permissionMapper.countRolePermission(roleId,permission);
            //第四步：如果当前角色权限在数据库中不存在，执行插入
            if (count == 0) {
                // 插入
                permissionMapper.saveRolePermission(roleId,permission);
            }
        }
        return ResultInfo.ok();
    }
}
